home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / usr / sbin / mkinitramfs < prev    next >
Text File  |  2009-09-22  |  9KB  |  362 lines

  1. #!/bin/sh
  2.  
  3. umask 0022
  4. export PATH='/usr/bin:/sbin:/bin'
  5.  
  6. # Defaults
  7. keep="n"
  8. CONFDIR="/etc/initramfs-tools"
  9. verbose="n"
  10. errors_to="2>/dev/null"
  11. BUSYBOXDIR="/usr/lib/initramfs-tools/bin/"
  12. # BUSYBOXDIR="/bin"
  13.  
  14. OPTIONS=`getopt -o d:ko:r:v --long supported-host-version:,supported-target-version: -n "$0" -- "$@"`
  15.  
  16. # Check for non-GNU getopt
  17. if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi
  18.  
  19. eval set -- "$OPTIONS"
  20.  
  21. while true; do
  22.     case "$1" in
  23.     -d)
  24.         CONFDIR="$2"
  25.         shift 2
  26.         if [ ! -d "${CONFDIR}" ]; then
  27.             echo "${0}: ${CONFDIR}: Not a directory" >&2
  28.             exit 1
  29.         fi
  30.         ;;
  31.     -o)
  32.         outfile="$2"
  33.         shift 2
  34.         ;;
  35.     -k)
  36.         keep="y"
  37.         shift
  38.         ;;
  39.     -r)
  40.         ROOT="$2"
  41.         shift 2
  42.         ;;
  43.     -v)
  44.         verbose="y"
  45.         shift
  46.         ;;
  47.     --supported-host-version)
  48.         supported_host_version="$2"
  49.         shift 2
  50.         ;;
  51.     --supported-target-version)
  52.         supported_target_version="$2"
  53.         shift 2
  54.         ;;
  55.     --)
  56.         shift
  57.         break
  58.         ;;
  59.     *)
  60.         echo "Internal error!" >&2
  61.         exit 1
  62.         ;;
  63.     esac
  64. done
  65.  
  66. # FIXME: remove after Lenny (needed for Etch linux-images)
  67. if [ -n "$supported_host_version" ] || [ -n "$supported_target_version" ]; then
  68.     if [ -n "$supported_host_version" ]; then
  69.         host_upstream_version="${supported_host_version%%-*}"
  70.     fi
  71.     if [ -n "$supported_target_version" ]; then
  72.         target_upstream_version="${supported_target_version%%-*}"
  73.         if dpkg --compare-versions "$target_upstream_version" lt "2.6.12"; then
  74.             exit 2
  75.         fi
  76.     fi
  77.     echo "Depreciation warning: use ramdisk=mkinitramfs-kpkg."
  78.     exit 0
  79. fi
  80.  
  81. # For dependency ordered mkinitramfs hook scripts.
  82. . /usr/share/initramfs-tools/scripts/functions
  83. . /usr/share/initramfs-tools/hook-functions
  84.  
  85. . "${CONFDIR}/initramfs.conf"
  86. EXTRA_CONF=''
  87. for i in /usr/share/initramfs-tools/conf.d/* ${CONFDIR}/conf.d/*; do
  88.     EXTRA_CONF="${EXTRA_CONF} $(basename $i \
  89.         | grep '^[[:alnum:]][[:alnum:]\._-]*$' | grep -v '\.dpkg-.*$')";
  90. done
  91. # FIXME: deprecated those settings on mkinitramfs run
  92. #        these conf dirs are for boot scripts and land on initramfs
  93. for i in ${EXTRA_CONF}; do
  94.     if [ -e  ${CONFDIR}/conf.d/${i} ]; then
  95.         . ${CONFDIR}/conf.d/${i}
  96.     elif [ -e  /usr/share/initramfs-tools/conf.d/${i} ]; then
  97.         . /usr/share/initramfs-tools/conf.d/${i}
  98.     fi
  99. done
  100.  
  101. # source package confs
  102. for i in /usr/share/initramfs-tools/conf-hooks.d/*; do
  103.     if [ -e "${i}" ]; then
  104.         . "${i}"
  105.     fi
  106. done
  107.  
  108. if [ -n "${UMASK}" ]; then
  109.     umask "${UMASK}"
  110. fi
  111.  
  112. if [ -z "${outfile}" ]; then
  113.     usage
  114. fi
  115.  
  116. touch "$outfile"
  117. outfile="$(readlink -f "$outfile")"
  118.  
  119. # And by "version" we really mean path to kernel modules
  120. # This is braindead, and exists to preserve the interface with mkinitrd
  121. if [ ${#} -ne 1 ]; then
  122.     version="$(uname -r)"
  123. else
  124.     version="${1}"
  125. fi
  126.  
  127. # Check that we're using a new enough kernel version, first for ourselves,
  128. # then for each of the hooks, which can have a MINKVER variable defined
  129. check_minkver ${version}
  130. check_minkver ${version} /usr/share/initramfs-tools/hooks
  131. check_minkver ${version} ${CONFDIR}/hooks
  132.  
  133. case "${version}" in
  134. /lib/modules/*/[!/]*)
  135.     ;;
  136. /lib/modules/[!/]*)
  137.     version="${version#/lib/modules/}"
  138.     version="${version%%/*}"
  139.     ;;
  140. esac
  141.  
  142. case "${version}" in
  143. */*)
  144.     echo "$PROG: ${version} is not a valid kernel version" >&2
  145.     exit 1
  146.     ;;
  147. esac
  148.  
  149. if [ -d "${outfile}" ]; then
  150.     echo "${outfile} is a directory"
  151.     exit 1
  152. fi
  153.  
  154. MODULESDIR="/lib/modules/${version}"
  155.  
  156. if [ ! -e "${MODULESDIR}" ]; then
  157.     echo "Cannot find ${MODULESDIR}"
  158.     exit 1
  159. fi
  160. if [ ! -e "${MODULESDIR}/modules.dep" ]; then
  161.     depmod ${version}
  162. fi
  163.  
  164. DESTDIR="$(mktemp -t -d mkinitramfs_XXXXXX)" || exit 1
  165. chmod 755 "${DESTDIR}"
  166. __TMPCPIOGZ="$(mktemp -t mkinitramfs-OL_XXXXXX)" || exit 1
  167.  
  168. DPKG_ARCH=`dpkg --print-architecture`
  169.  
  170. # Export environment for hook scripts.
  171. #
  172. export MODULESDIR
  173. export version
  174. export CONFDIR
  175. export DESTDIR
  176. export DPKG_ARCH
  177. export verbose
  178. export KEYMAP
  179. export MODULES
  180. export COMPCACHE_SIZE
  181.  
  182. # Private, used by 'catenate_cpiogz'.
  183. export __TMPCPIOGZ
  184.  
  185. for d in bin conf/conf.d etc lib/modules sbin scripts ${MODULESDIR}; do
  186.     mkdir -p "${DESTDIR}/${d}"
  187. done
  188.  
  189. # Copy the modules.order file in
  190. if [ -f "${MODULESDIR}/modules.order" ]; then
  191.     cp -p "${MODULESDIR}/modules.order" \
  192.           "${DESTDIR}${MODULESDIR}/modules.order"
  193. fi
  194.  
  195. # MODULES=list case.  Always honour.
  196. for x in "${CONFDIR}/modules" /usr/share/initramfs-tools/modules.d/*; do
  197.     if [ -f "${x}" ]; then
  198.         add_modules_from_file "${x}"
  199.     fi
  200. done
  201.  
  202. # MODULES=most is default
  203. case "${MODULES}" in
  204. dep)
  205.     dep_add_modules
  206.     ;;
  207. most)
  208.     auto_add_modules
  209.     ;;
  210. netboot)
  211.     auto_add_modules base
  212.     auto_add_modules net
  213.     ;;
  214. list)
  215.     # nothing to add
  216.     ;;
  217. *)
  218.     echo "mkinitramfs: Warning unsupported MODULES setting: ${MODULES}."
  219.     echo "mkinitramfs: Falling back to MODULES=most."
  220.     auto_add_modules
  221.     ;;
  222. esac
  223.  
  224. # Have to do each file, because cpio --dereference doesn't recurse down
  225. # symlinks.
  226.  
  227. # klibc
  228. ln -s /usr/lib/klibc/bin/* ${DESTDIR}/bin
  229. ln -s /lib/klibc-*.so ${DESTDIR}/lib
  230. rm -f ${DESTDIR}/bin/kinit* ${DESTDIR}/bin/gzip
  231.  
  232. copy_exec /usr/share/initramfs-tools/init /init
  233.  
  234. # add existant boot scripts
  235. for b in $(cd /usr/share/initramfs-tools/scripts/ && find . \
  236.     -regextype posix-extended -regex '.*/[[:alnum:]_]+$' -type f); do
  237.     option=$(sed '/^OPTION=/!d;$d;s/^OPTION=//;s/[[:space:]]*$//' "/usr/share/initramfs-tools/scripts/${b}")
  238.     [ -z "${option}" ] || eval test -n \"\${$option}\" -a \"\${$option}\" != \"n\" || continue
  239.  
  240.     [ -d "${DESTDIR}/scripts/$(dirname "${b}")" ] \
  241.         || mkdir -p "${DESTDIR}/scripts/$(dirname "${b}")"
  242.     cp -p "/usr/share/initramfs-tools/scripts/${b}" \
  243.         "${DESTDIR}/scripts/$(dirname "${b}")/"
  244. done
  245. for b in $(cd "${CONFDIR}/scripts" && find . \
  246.     -regextype posix-extended -regex '.*/[[:alnum:]_]+$' -type f); do
  247.     option=$(sed '/^OPTION=/!d;$d;s/^OPTION=//;s/[[:space:]]*$//' "${CONFDIR}/scripts/${b}")
  248.     [ -z "${option}" ] || eval test -n \"\${$option}\" -a \"\${$option}\" != \"n\" || continue
  249.  
  250.     [ -d "${DESTDIR}/scripts/$(dirname "${b}")" ] \
  251.         || mkdir -p "${DESTDIR}/scripts/$(dirname "${b}")"
  252.     cp -p "${CONFDIR}/scripts/${b}" "${DESTDIR}/scripts/$(dirname "${b}")/"
  253. done
  254.  
  255. echo "DPKG_ARCH=${DPKG_ARCH}" > ${DESTDIR}/conf/arch.conf
  256. echo "PAGE_SIZE=$(getconf PAGESIZE)" > ${DESTDIR}/conf/page_size.conf
  257. copy_exec "${CONFDIR}/initramfs.conf" /conf
  258. for i in ${EXTRA_CONF}; do
  259.     if [ -e "${CONFDIR}/conf.d/${i}" ]; then
  260.         copy_exec "${CONFDIR}/conf.d/${i}" /conf/conf.d
  261.     elif [ -e "/usr/share/initramfs-tools/conf.d/${i}" ]; then
  262.         copy_exec "/usr/share/initramfs-tools/conf.d/${i}" /conf/conf.d
  263.     fi
  264. done
  265.  
  266. # ROOT hardcoding
  267. if [ -n "${ROOT}" ]; then
  268.     echo "ROOT=${ROOT}" > ${DESTDIR}/conf/conf.d/root
  269. fi
  270.  
  271. # Busybox
  272. if [ "${BUSYBOX}" = "n" ] || [ ! -e ${BUSYBOXDIR}/busybox ]; then
  273.     mv ${DESTDIR}/bin/sh.shared ${DESTDIR}/bin/sh
  274.     # those root need busybox
  275.     eval "$(mount | awk '/ \/ / {print "r_dev=" $1; exit}')"
  276.     if [ "${r_dev#/dev/mapper/}" != "${r_dev}" ] \
  277.         || [ "${r_dev#/dev/md}" != "${r_dev}" ]; then
  278.         echo "Warning: Busybox is required for successful boot!"
  279.     fi
  280. else
  281.     # Busybox is configured to prefer its own applets, so remove
  282.     # duplication from klibc.
  283.     for cmd in `${BUSYBOXDIR}/busybox | sed -n '/functions:$/,$p' \
  284.         | tail -n +2 \
  285.         | sed -e 's/[[:space:]]*//g; s/,$//; s/,/\n/g; /busybox/d'`; do
  286.         rm -f ${DESTDIR}/bin/${cmd}
  287.     done
  288.     rm -f ${DESTDIR}/bin/sh
  289.     rm -f ${DESTDIR}/bin/busybox
  290.     copy_exec ${BUSYBOXDIR}/busybox /bin/busybox
  291.     ln -s ${BUSYBOXDIR}/busybox ${DESTDIR}/bin/sh
  292.     # klibc's version is just wrong; patch sent upstream by maks
  293.     rm -f ${DESTDIR}/bin/chroot
  294.     # klibc's version can't display mounts, which casper needs; fuse
  295.     # needs /bin/mount to exist, so add a symlink
  296.     rm -f ${DESTDIR}/bin/mount
  297.     ln -s busybox ${DESTDIR}/bin/mount
  298.     # ... but some scripts expect /bin/sleep to exist. Boo.
  299.     ln -s busybox ${DESTDIR}/bin/sleep
  300.     # Useless
  301.     for cmd in minips nuke sh.shared; do
  302.         rm -f ${DESTDIR}/bin/${cmd}
  303.     done
  304. fi
  305.  
  306. # Modutils
  307. copy_exec /sbin/modprobe /sbin
  308. copy_exec /sbin/depmod /sbin
  309. copy_exec /sbin/rmmod /sbin
  310. mkdir -p "${DESTDIR}/etc/modprobe.d"
  311. cp -a /etc/modprobe.d/* "${DESTDIR}/etc/modprobe.d/"
  312.  
  313. # util-linux
  314. copy_exec /sbin/blkid /sbin
  315.  
  316. # workaround: libgcc always needed on old-abi arm
  317. if [ "$DPKG_ARCH" = arm ] || [ "$DPKG_ARCH" = armeb ]; then
  318.     cp -a /lib/libgcc_s.so.1 "${DESTDIR}/lib/"
  319. fi
  320.  
  321. run_scripts /usr/share/initramfs-tools/hooks optional
  322. run_scripts "${CONFDIR}"/hooks optional
  323.  
  324. # Apply DSDT to initramfs
  325. if [ -e "${CONFDIR}/DSDT.aml" ]; then
  326.     copy_exec "${CONFDIR}/DSDT.aml" /
  327. fi
  328.  
  329. [ "${verbose}" = y ] && echo "Building cpio ${outfile} initramfs"
  330. (
  331. # work around lack of "set -o pipefail" for the following pipe:
  332. # cd "${DESTDIR}" && find . | cpio --quiet --dereference -o -H newc | gzip >"${outfile}"
  333. exec 3>&1
  334. eval `
  335.     # http://cfaj.freeshell.org/shell/cus-faq-2.html
  336.     exec 4>&1 >&3 3>&-
  337.     cd  "${DESTDIR}" 
  338.     {
  339.         find . 4>&-; echo "ec1=$?;" >&4
  340.     } | {
  341.         cpio --quiet --dereference -o -H newc 4>&-; echo "ec2=$?;" >&4
  342.     } | gzip >"${outfile}"
  343.     echo "ec3=$?;" >&4
  344. `
  345. if [ "$ec1" -ne 0 ]; then exit "$ec1"; fi
  346. if [ "$ec2" -ne 0 ]; then exit "$ec2"; fi
  347. if [ "$ec3" -ne 0 ]; then exit "$ec3"; fi
  348. ) || exit 1
  349.  
  350. if [ -s "${__TMPCPIOGZ}" ]; then
  351.     cat "${__TMPCPIOGZ}" >>"${outfile}" || exit 1
  352. fi
  353.  
  354. if [ "${keep}" = "y" ]; then
  355.     echo "Working files in ${DESTDIR} and overlay in ${__TMPCPIOGZ}"
  356. else
  357.     rm -rf "${DESTDIR}"
  358.     rm -rf "${__TMPCPIOGZ}"
  359. fi
  360.  
  361. exit 0
  362.